package com.coconet.gas.vo;

import com.coconet.gas.dao.IpsRuleMapper;
import com.coconet.gas.vo.dw.IpsRule;
import com.coconet.gas.vo.dw.Report;
import com.gxa.entity.ResultInfoPage;
import com.gxa.entity.TaskInfoEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Component
public class PageService {

    @Autowired
    private IpsRuleMapper ipsRuleMapper;

    private List<IpsRule> ipsList = new ArrayList<>();

    //在springboot环境启动的时候就运行此代码相当于代码中的static
    @PostConstruct
    public void initIpsRule(){
        ipsList = ipsRuleMapper.selectAll();
    }
    public void PageResult(List<ResultInfoPage> list,TaskInfoEntity taskInfoEntity,Assets asset,List<Report> reportByReportId,String date1, String date2,String assetsName, String lv, String ip) throws ParseException {
        for (Report report : reportByReportId) {
//            IpsRule ipsRule = ipsList.stream().filter(a -> report.getCve().equals(a.getCve())).findFirst().get();
            IpsRule ipsRule = null;
            Optional<IpsRule> first = ipsList.stream().filter(a -> report.getCve().equals(a.getCve())).findFirst();
            if(first != null && first.isPresent()) {
                ipsRule  = first.get();
            }
//            IpsRule ipsRule = ipsRuleMapper.findIpsRuleByCveType(report.getCve().trim());
            //通过分隔出来的 ip 获取一个资产对象(Assets)
            //遍历报告列表
            //解析时间格式
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            //定义标志 三个都为true时添加到集合
            boolean TimeFlag=false;
            boolean IpFlag=false;
            boolean LvFlag=false;
            boolean assetsFlag=false;

            //没有取反的是 如果为空就是true
            /**
             * 时间 false
             * ip false
             * 等级 false
             * 资产名称 false
             */
            if (StringUtils.isEmpty(date1)&&StringUtils.isEmpty(date2)
                    &&StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {
                ResultInfoPage resultInfoPage = new ResultInfoPage();
                NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);
                continue;
            }

            /**
             * 时间 t
             * ip t
             * 等级 t
             * 资产名称 t
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断ip是否相等
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断漏洞等级是否相等

                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断资产姓名是否相等

                if (asset.getAssetsname().equals(assetsName)) {
                    assetsFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (TimeFlag&&IpFlag&&LvFlag&&assetsFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);
                    continue;
                }
            }

            /**
             * 时间 f
             * ip f
             * 等级 f
             * 资产名称 t
             * 1
             */
            if (StringUtils.isEmpty(date1)&&StringUtils.isEmpty(date2)
                    &&StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
//                    判断资产名称是否相等
                    if (assetsName.equals(asset.getAssetsname())) {
                        assetsFlag=true;
                    }
                    //判断三个条件是否 成立\成立则添加到集合
                    if (assetsFlag){
                        ResultInfoPage resultInfoPage = new ResultInfoPage();
                        NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                        continue;
                    }

            }

            /**
             * 时间 t
             * ip f
             * 等级 f
             * 资产名称 t
             * 2
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断资产名称是否相等
                if (assetsName.equals(asset.getAssetsname())) {
                    assetsFlag=true;
                }
                    //判断三个条件是否 成立\成立则添加到集合
                    if (TimeFlag&&assetsFlag){
                        ResultInfoPage resultInfoPage = new ResultInfoPage();
                        NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);
                        continue;
                    }

            }

            /**
             * 时间 t
             * ip t
             * 等级 f
             * 资产名称 t
             * 3
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断ip是否相等
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断资产名称是否相等
                if (assetsName.equals(asset.getAssetsname())) {
                    assetsFlag=true;
                }
                    //判断三个条件是否 成立\成立则添加到集合
                    if (TimeFlag&&IpFlag&&assetsFlag) {
                        ResultInfoPage resultInfoPage = new ResultInfoPage();
                        NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                        continue;
                    }
            }

            /**
             * 时间 f
             * ip t
             * 等级 f
             * 资产名称 t
             * 4
             */
            if (StringUtils.isEmpty(date1)&&StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
                //判断ip是否相等
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断资产名称是否相等
                if (assetsName.equals(asset.getAssetsname())) {
                    assetsFlag=true;
                }
                    //判断三个条件是否 成立\成立则添加到集合
                    if (IpFlag&&assetsFlag){
                        ResultInfoPage resultInfoPage = new ResultInfoPage();
                        NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                        continue;
                    }
            }

            /**
             * 时间 f
             * ip f
             * 等级 t
             * 资产名称 t
             * 5
             */
            if (StringUtils.isEmpty(date1)&&StringUtils.isEmpty(date2)
                    &&StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
                //判断漏洞等级是否相等
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断资产名称是否相等
                if (assetsName.equals(asset.getAssetsname())) {
                    assetsFlag=true;
                }
                    //判断三个条件是否 成立\成立则添加到集合
                    if (LvFlag&&assetsFlag){
                        ResultInfoPage resultInfoPage = new ResultInfoPage();
                        NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                        continue;
                    }
            }
            /**
             * 时间 t
             * ip t
             * 等级 t
             * 资产名称 t
             * 6 *
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断ip是否相等
//                        System.out.println(report.getIp());
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断漏洞等级是否相等
//                        System.out.println(report.getThreat());
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断资产名称是否相等
                if (assetsName.equals(asset.getAssetsname())) {
                    assetsFlag=true;
                }
                    //判断三个条件是否 成立\成立则添加到集合
                    if (TimeFlag&&IpFlag&&LvFlag&&assetsFlag){
                        ResultInfoPage resultInfoPage = new ResultInfoPage();
                        NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                        continue;
                    }
            }

            /**
             * 时间 t
             * ip t
             * 等级 t
             * 资产名称 f
             * 7
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断ip是否相等
//                        System.out.println(report.getIp());
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断漏洞等级是否相等
//                        System.out.println(report.getThreat());
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (TimeFlag&&IpFlag&&LvFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }

            /**
             * 时间 t
             * ip t
             * 等级 f
             * 资产名称 f
             * 8 *
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断ip是否相等
//                        System.out.println(report.getIp());
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (TimeFlag&&IpFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }

            /**
             * 时间 t
             * ip f
             * 等级 f
             * 资产名称 f
             * 9
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (TimeFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }

            /**
             * 时间 t
             * ip t
             * 等级 t
             * 资产名称 t
             * 10 *
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&!StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断ip是否相等
//                        System.out.println(report.getIp());
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断漏洞等级是否相等
//                        System.out.println(report.getThreat());
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断资产名称是否相等
                if (assetsName.equals(asset.getAssetsname())) {
                    assetsFlag=true;
                }
                    //判断三个条件是否 成立\成立则添加到集合
                    if (TimeFlag&&IpFlag&&LvFlag&&assetsFlag){
                        ResultInfoPage resultInfoPage = new ResultInfoPage();
                        NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                        continue;
                    }
            }

            /**
             * 时间 f
             * ip t
             * 等级 f
             * 资产名称 f
             * 11
             */
            if (StringUtils.isEmpty(date1)&&StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {
                //判断ip是否相等
//                        System.out.println(report.getIp());
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (IpFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }

            /**
             * 时间 f
             * ip t
             * 等级 t
             * 资产名称 f
             * 12
             */
            if (StringUtils.isEmpty(date1)&&StringUtils.isEmpty(date2)
                    &&!StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {

                //判断ip是否相等
//                        System.out.println(report.getIp());
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断漏洞等级是否相等
//                        System.out.println(report.getThreat());
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }

                //判断三个条件是否 成立\成立则添加到集合
                if (IpFlag&&LvFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }
            /**
             * 时间 f
             * ip f
             * 等级 t
             * 资产名称 f
             * 13
             */
            if (StringUtils.isEmpty(date1)&&StringUtils.isEmpty(date2)
                    &&StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {
                //判断漏洞等级是否相等
//                        System.out.println(report.getThreat());
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (LvFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }

            /**
             * 时间 t
             * ip f
             * 等级 t
             * 资产名称 f
             * 14
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)
                    &&StringUtils.isEmpty(ip)
                    &&!StringUtils.isEmpty(lv)
                    &&StringUtils.isEmpty(assetsName)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断漏洞等级是否相等
//                        System.out.println(report.getThreat());
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (TimeFlag&&LvFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }

            /**
             * 时间 true
             * ip true
             * 等级 true
             */
            if (!StringUtils.isEmpty(date1)&&!StringUtils.isEmpty(date2)&&!StringUtils.isEmpty(ip)&&!StringUtils.isEmpty(lv)) {
                long time = simpleDateFormat.parse(date1).getTime(); //传过来的值
                long time1 = simpleDateFormat.parse(date2).getTime(); //传过来的值
                long time2 = simpleDateFormat.parse(taskInfoEntity.getCheckTime()).getTime(); //当前的值
                //判断是否在两个时间点
                if (time<=time2&&time2<=time1){
                    TimeFlag=true;
                }
                //判断ip是否相等
                if (report.getIp().equals(ip)) {
                    IpFlag=true;
                }
                //判断漏洞等级是否相等
                if (report.getThreat().equals(lv)) {
                    LvFlag=true;
                }
                //判断三个条件是否 成立\成立则添加到集合
                if (TimeFlag&&IpFlag&&LvFlag){
                    ResultInfoPage resultInfoPage = new ResultInfoPage();
                    NewResultInfo(resultInfoPage,list,report,ipsRule,asset,taskInfoEntity);

                    continue;
                }
            }

        }
    }
    public void NewResultInfo(ResultInfoPage resultInfoPage, List list, Report report,IpsRule ipsRule, Assets asset, TaskInfoEntity taskInfoEntity){
        if (!StringUtils.isEmpty(ipsRule)) {
            resultInfoPage.setCveName(report.getCveName());
            resultInfoPage.setCveNumber(report.getCve());
            resultInfoPage.setPort(report.getPort());
            resultInfoPage.setCveType(ipsRule.getType());
            resultInfoPage.setAssetsname(asset.getAssetsname());
            resultInfoPage.setAssetsip(asset.getIp());
            resultInfoPage.setScanningTime(taskInfoEntity.getCheckTime());
            resultInfoPage.setAssetsType(asset.getAssetstype());
            resultInfoPage.setCveLv(report.getThreat());
            list.add(resultInfoPage);
        }else {
            resultInfoPage.setCveName(report.getCveName());
            resultInfoPage.setCveNumber(report.getCve());
            resultInfoPage.setPort(report.getPort());
//            resultInfoPage.setCveType(ipsRule.getType());
            if (!StringUtils.isEmpty(asset)){
                resultInfoPage.setAssetsname(asset.getAssetsname());
                resultInfoPage.setAssetsip(asset.getIp());
                resultInfoPage.setScanningTime(taskInfoEntity.getCheckTime());
                resultInfoPage.setAssetsType(asset.getAssetstype());
                resultInfoPage.setCveLv(report.getThreat());
                list.add(resultInfoPage);
            }else {
                resultInfoPage.setScanningTime(taskInfoEntity.getCheckTime());
                resultInfoPage.setCveLv(report.getThreat());
                list.add(resultInfoPage);
            }
        }

    }

}
